{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "# AutoML with Text data - Using AutoGluon "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Here we introduce the `TextPrediction` task, which helps you automatically train and deploy models for various Natural Language Processing (NLP) problems.\n",
    "This tutorial presents two examples to quickly demonstrate how `TextPrediction` can be used for different NLP tasks including:\n",
    "- [Sentiment Analysis](https://en.wikipedia.org/wiki/Sentiment_analysis)\n",
    "- [Sentence Similarity](https://arxiv.org/abs/1910.03940)\n",
    "\n",
    "The general usage is similar to AutoGluon's `TabularPrediction` module. We treat NLP datasets as tables where certain columns contain text fields and a special column contains the labels to predict. Here, the labels can be discrete categories (classification) or numerical values (regression).\n",
    "`TextPrediction` fits neural networks to your data via transfer learning from pretrained NLP models like: [BERT](https://arxiv.org/pdf/1810.04805.pdf), [ALBERT](https://arxiv.org/pdf/1909.11942.pdf), and [ELECTRA](https://openreview.net/pdf?id=r1xMH1BtvB).\n",
    "`TextPrediction` also trains multiple models with different hyperparameters and returns the best model, a process called Hyperparameter Optimization (HPO)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "np.random.seed(123)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Sentiment Analysis\n",
    "\n",
    "First, we consider the Stanford Sentiment Treebank ([SST](https://nlp.stanford.edu/sentiment/)) dataset, which consists of movie reviews and their associated sentiment. Given a new movie review, the goal is to predict the sentiment reflected in the text (in this case a **binary classification** problem, where reviews are labeled as 1 if they convey a positive opinion and labeled as 0 otherwise). Let's first load the data and view some examples, noting the labels are stored in a column called **label**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Loaded data from: https://autogluon-text.s3-accelerate.amazonaws.com/glue/sst/train.parquet | Columns = 2 / 2 | Rows = 67349 -> 67349\n",
      "Loaded data from: https://autogluon-text.s3-accelerate.amazonaws.com/glue/sst/dev.parquet | Columns = 2 / 2 | Rows = 872 -> 872\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sentence</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2434</th>\n",
       "      <td>goes by quickly</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27796</th>\n",
       "      <td>reading lines from a teleprompter</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>249</th>\n",
       "      <td>degraded , handheld blair witch video-cam foot...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12115</th>\n",
       "      <td>reminds us how realistically nuanced a robert ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50834</th>\n",
       "      <td>indulges in the worst elements of all of them .</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>43622</th>\n",
       "      <td>are nowhere near as vivid as the 19th-century ...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3955</th>\n",
       "      <td>throughout a film that is both gripping and co...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>51011</th>\n",
       "      <td>to see over and over again</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31232</th>\n",
       "      <td>that fails to match the freshness of the actre...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32153</th>\n",
       "      <td>this is an undeniably intriguing film from an ...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                sentence  label\n",
       "2434                                    goes by quickly       1\n",
       "27796                 reading lines from a teleprompter       0\n",
       "249    degraded , handheld blair witch video-cam foot...      0\n",
       "12115  reminds us how realistically nuanced a robert ...      1\n",
       "50834   indulges in the worst elements of all of them .       0\n",
       "43622  are nowhere near as vivid as the 19th-century ...      0\n",
       "3955   throughout a film that is both gripping and co...      1\n",
       "51011                        to see over and over again       1\n",
       "31232  that fails to match the freshness of the actre...      0\n",
       "32153  this is an undeniably intriguing film from an ...      1"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from autogluon.utils.tabular.utils.loaders.load_pd import load\n",
    "train_data = load('https://autogluon-text.s3-accelerate.amazonaws.com/glue/sst/train.parquet')\n",
    "dev_data = load('https://autogluon-text.s3-accelerate.amazonaws.com/glue/sst/dev.parquet')\n",
    "\n",
    "rand_idx = np.random.permutation(np.arange(len(train_data)))[:2000]\n",
    "train_data = train_data.iloc[rand_idx]\n",
    "train_data.head(10)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Above the data happen to be stored in a [Parquet](https://databricks.com/glossary/what-is-parquet) table format, but you can also directly `load()` data from a [CSV](https://en.wikipedia.org/wiki/Comma-separated_values) file instead. While here we load files from [AWS S3 cloud storage](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html), these could instead be local files on your machine. After loading, `train_data` is simply a [Pandas DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html), where each row represents a different training example (for machine learning to be appropriate, the rows should be independent and identically distributed).\n",
    "\n",
    "To ensure this tutorial runs quickly, we simply call `fit()` with a subset of 2000 training examples and limit its runtime to approximately 2 minutes. To achieve reasonable performance in your applications, you should set much longer `time_limits` (eg. 1 hour), or do not specify `time_limits` at all."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-08-05 08:02:03,920 - root - INFO - All Logs will be saved to ./ag_sst/ag_text_prediction.log\n",
      "2020-08-05 08:02:03,932 - root - INFO - Train Dataset:\n",
      "2020-08-05 08:02:03,932 - root - INFO - Columns:\n",
      "\n",
      "- Text(\n",
      "   name=\"sentence\"\n",
      "   #total/missing=1700/0\n",
      "   length, min/avg/max=4/51.83/259\n",
      ")\n",
      "- Categorical(\n",
      "   name=\"label\"\n",
      "   #total/missing=1700/0\n",
      "   num_class (total/non_special)=2/2\n",
      "   categories=[0, 1]\n",
      "   freq=[740, 960]\n",
      ")\n",
      "\n",
      "\n",
      "2020-08-05 08:02:03,933 - root - INFO - Tuning Dataset:\n",
      "2020-08-05 08:02:03,933 - root - INFO - Columns:\n",
      "\n",
      "- Text(\n",
      "   name=\"sentence\"\n",
      "   #total/missing=300/0\n",
      "   length, min/avg/max=5/56.73/218\n",
      ")\n",
      "- Categorical(\n",
      "   name=\"label\"\n",
      "   #total/missing=300/0\n",
      "   num_class (total/non_special)=2/2\n",
      "   categories=[0, 1]\n",
      "   freq=[141, 159]\n",
      ")\n",
      "\n",
      "\n",
      "2020-08-05 08:02:03,933 - root - INFO - Label columns=['label'], Problem types=['classification'], Label shapes=[2]\n",
      "2020-08-05 08:02:03,934 - root - INFO - Eval Metric=acc, Stop Metric=acc, Log Metrics=['f1', 'mcc', 'auc', 'acc', 'nll']\n",
      "2020-08-05 08:02:03,934 - root - INFO - NumPy-shape semantics has been activated in your code. This is required for creating and manipulating scalar and zero-size tensors, which were not supported in MXNet before, as in the official NumPy library. Please DO NOT manually deactivate this semantics while using `mxnet.numpy` and `mxnet.numpy_extension` modules.\n",
      "2020-08-05 08:02:03,940 - root - INFO - NumPy array semantics has been activated in your code. This allows you to use operators from MXNet NumPy and NumPy Extension modules as well as MXNet NumPy `ndarray`s.\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "e90c3b9ab027433da48812e6c7a0e924",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, max=4.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 76%|███████▌  | 161/212 [00:20<00:06,  7.93it/s]\n",
      " 95%|█████████▌| 202/212 [00:26<00:00, 10.14it/s]\n",
      "100%|██████████| 212/212 [00:26<00:00,  7.98it/s]\n",
      "100%|██████████| 212/212 [00:27<00:00,  7.77it/s]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from autogluon import TextPrediction as task\n",
    "\n",
    "predictor = task.fit(train_data,\n",
    "                     label='label',\n",
    "                     time_limits='2min',\n",
    "                     ngpus_per_trial=1,\n",
    "                     seed=123,\n",
    "                     output_directory='./ag_sst')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Above we specify that: the **label** column of our DataFrame contains the label-values to predict, AutoGluon should run for 60 seconds, each training run of an individual model (with particular hyperparameters) should run on 1 GPU, a particular random seed should be used to facilitate reproducibility, and that trained models should be saved in the **ag_sst** folder.\n",
    "\n",
    "Now you can use `predictor.evaluate()` to evaluate the trained model on some separate test data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total Time = 33.737322092056274s\n",
      "Accuracy = 82.45%\n"
     ]
    }
   ],
   "source": [
    "dev_score = predictor.evaluate(dev_data, metrics='acc')\n",
    "print('Total Time = {}s'.format(predictor.results['total_time']))\n",
    "print('Accuracy = {:.2f}%'.format(dev_score['acc'] * 100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "And just as before, you can easily obtain predictions from these text models."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"Sentence\": it's a charming and often affecting journey. \"Sentiment\": 1\n",
      "\"Sentence\": It's slow, very, very, very slow. \"Sentiment\": 0\n"
     ]
    }
   ],
   "source": [
    "sentence1 = \"it's a charming and often affecting journey.\" \n",
    "sentence2 = \"It's slow, very, very, very slow.\"\n",
    "predictions = predictor.predict({'sentence': [sentence1, sentence2]})\n",
    "print('\"Sentence\":', sentence1, '\"Sentiment\":', predictions[0])\n",
    "print('\"Sentence\":', sentence2, '\"Sentiment\":', predictions[1])\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "For classification tasks, you can ask for predicted class-probabilities instead of predicted classes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\"Sentence\": it's a charming and often affecting journey. \"Sentiment\": [0.00107836 0.99892163]\n",
      "\"Sentence\": It's slow, very, very, very slow. \"Sentiment\": [0.73069537 0.26930466]\n"
     ]
    }
   ],
   "source": [
    "probs = predictor.predict_proba({'sentence': [sentence1, sentence2]})\n",
    "print('\"Sentence\":', sentence1, '\"Sentiment\":', probs[0])\n",
    "print('\"Sentence\":', sentence2, '\"Sentiment\":', probs[1])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Sentence Similarity\n",
    "\n",
    "Next, let's use AutoGluon to train a model for evaluating how semantically similar two sentences are. We use the [Semantic Textual Similarity Benchmark](http://ixa2.si.ehu.es/stswiki/index.php/STSbenchmark) dataset for illustration. This is a regression problem."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>sentence1</th>\n",
       "      <th>sentence2</th>\n",
       "      <th>score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>A plane is taking off.</td>\n",
       "      <td>An air plane is taking off.</td>\n",
       "      <td>5.00</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>A man is playing a large flute.</td>\n",
       "      <td>A man is playing a flute.</td>\n",
       "      <td>3.80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>A man is spreading shreded cheese on a pizza.</td>\n",
       "      <td>A man is spreading shredded cheese on an uncoo...</td>\n",
       "      <td>3.80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Three men are playing chess.</td>\n",
       "      <td>Two men are playing chess.</td>\n",
       "      <td>2.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>A man is playing the cello.</td>\n",
       "      <td>A man seated is playing the cello.</td>\n",
       "      <td>4.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>Some men are fighting.</td>\n",
       "      <td>Two men are fighting.</td>\n",
       "      <td>4.25</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>A man is smoking.</td>\n",
       "      <td>A man is skating.</td>\n",
       "      <td>0.50</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>The man is playing the piano.</td>\n",
       "      <td>The man is playing the guitar.</td>\n",
       "      <td>1.60</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>8</th>\n",
       "      <td>A man is playing on a guitar and singing.</td>\n",
       "      <td>A woman is playing an acoustic guitar and sing...</td>\n",
       "      <td>2.20</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>A person is throwing a cat on to the ceiling.</td>\n",
       "      <td>A person throws a cat on the ceiling.</td>\n",
       "      <td>5.00</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                       sentence1  \\\n",
       "0                         A plane is taking off.   \n",
       "1                A man is playing a large flute.   \n",
       "2  A man is spreading shreded cheese on a pizza.   \n",
       "3                   Three men are playing chess.   \n",
       "4                    A man is playing the cello.   \n",
       "5                         Some men are fighting.   \n",
       "6                              A man is smoking.   \n",
       "7                  The man is playing the piano.   \n",
       "8      A man is playing on a guitar and singing.   \n",
       "9  A person is throwing a cat on to the ceiling.   \n",
       "\n",
       "                                           sentence2  score  \n",
       "0                        An air plane is taking off.   5.00  \n",
       "1                          A man is playing a flute.   3.80  \n",
       "2  A man is spreading shredded cheese on an uncoo...   3.80  \n",
       "3                         Two men are playing chess.   2.60  \n",
       "4                 A man seated is playing the cello.   4.25  \n",
       "5                              Two men are fighting.   4.25  \n",
       "6                                  A man is skating.   0.50  \n",
       "7                     The man is playing the guitar.   1.60  \n",
       "8  A woman is playing an acoustic guitar and sing...   2.20  \n",
       "9              A person throws a cat on the ceiling.   5.00  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data = load('https://autogluon-text.s3-accelerate.amazonaws.com/glue/sts/train.parquet')[['sentence1', 'sentence2', 'score']]\n",
    "dev_data = load('https://autogluon-text.s3-accelerate.amazonaws.com/glue/sts/dev.parquet')[['sentence1', 'sentence2', 'score']]\n",
    "train_data.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Min score= 0.0 , Max score= 5.0\n"
     ]
    }
   ],
   "source": [
    "print('Min score=', min(train_data['score']), ', Max score=', max(train_data['score']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "In this data, the **score** column contains numerical values (which we'd like to predict) that are human-annotated similarity scores for each given pair of sentences.\n",
    "\n",
    "Let's train a regression model to predict these scores with `task.fit()`. Note that we only need to specify the label column and AutoGluon automatically determines the type of prediction problem and an appropriate loss function. Once again, you should increase the short `time_limits` below to obtain reasonable performance in your own applications."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "scrolled": true,
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2020-08-05 08:12:51,632 - root - INFO - All Logs will be saved to ./ag_sts/ag_text_prediction.log\n",
      "2020-08-05 08:12:51,646 - root - INFO - Train Dataset:\n",
      "2020-08-05 08:12:51,647 - root - INFO - Columns:\n",
      "\n",
      "- Text(\n",
      "   name=\"sentence1\"\n",
      "   #total/missing=4886/0\n",
      "   length, min/avg/max=16/57.63/367\n",
      ")\n",
      "- Text(\n",
      "   name=\"sentence2\"\n",
      "   #total/missing=4886/0\n",
      "   length, min/avg/max=15/57.35/311\n",
      ")\n",
      "- Numerical(\n",
      "   name=\"score\"\n",
      "   #total/missing=4886/0\n",
      "   shape=()\n",
      ")\n",
      "\n",
      "\n",
      "2020-08-05 08:12:51,648 - root - INFO - Tuning Dataset:\n",
      "2020-08-05 08:12:51,648 - root - INFO - Columns:\n",
      "\n",
      "- Text(\n",
      "   name=\"sentence1\"\n",
      "   #total/missing=863/0\n",
      "   length, min/avg/max=17/58.16/267\n",
      ")\n",
      "- Text(\n",
      "   name=\"sentence2\"\n",
      "   #total/missing=863/0\n",
      "   length, min/avg/max=16/58.55/237\n",
      ")\n",
      "- Numerical(\n",
      "   name=\"score\"\n",
      "   #total/missing=863/0\n",
      "   shape=()\n",
      ")\n",
      "\n",
      "\n",
      "2020-08-05 08:12:51,649 - root - INFO - Label columns=['score'], Problem types=['regression'], Label shapes=[()]\n",
      "2020-08-05 08:12:51,650 - root - INFO - Eval Metric=mse, Stop Metric=mse, Log Metrics=['mse', 'rmse', 'mae']\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "54bac33850ef4125bf1e0a56f938e734",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "HBox(children=(FloatProgress(value=0.0, max=4.0), HTML(value='')))"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 60%|█████▉    | 367/612 [01:00<00:40,  6.08it/s]\n",
      " 57%|█████▋    | 351/612 [01:00<00:45,  5.78it/s]\n",
      " 63%|██████▎   | 383/612 [01:02<00:37,  6.13it/s]\n",
      " 60%|█████▉    | 367/612 [01:02<00:41,  5.85it/s]\n"
     ]
    },
    {
     "data": {
      "image/png": "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Yd/Ps88+y+bNm9m8efOggwQcHs1jD0ueQruzXZeiJy12Uuro8ItXtrOjqG5ItzkrKYq7Lzymx/dvu+02srOzmTdvHmeeeSZ33303y5cvp7q6Go/Hw69//WuWL19OY2Mjl19+OQUFBfh8Pu666y6uuOKKju00Nzdz8cUXc/HFF/Od73ynx/0NFQ0UPWifsMhlT1hkjCGnNocLJ184yjlTSh2p7rvvPrKysti8eTMAXq+Xl156iaioKCoqKliyZAkXXXQRb775JklJSbz22msA1NbWdmyjoaGBK6+8kq997Wt87WtfC7ifb3zjGzidTi655BLuvPPOQVfga6Dogae4CFdCAg57wqLSplIaPY06dIdSR4nefvmPFGMMt99+Ox999BEOh4PCwkJKS0uZM2cON910Ez/5yU+44IILOPnkkzvWWb58ObfeeitXXXVVwG0+++yzJCcnU19fzyWXXMIzzzzTY0DpK62j6IG3+OB5KLTFk1JqqD377LOUl5ezYcMGNm/ezPjx42lpaWHatGls3LiROXPmcOedd/LLX/6yY52TTjqJN998kx66n5GcnAxAZGQkX/nKV1i7du2g86mBogeeouJuFdmgLZ6UUgMXGRlJfX19x+va2loSExNxu928//777Nu3D4CioiLCwsK4+uqrueWWW9i4cWPHOr/85S+JjY3lhhtu6LZ9r9dLRUUFYA1X8uqrrzJ79uxu6fpLA0UAHRMWJXUKFLU5RAVFER8SP4o5U0odyeLj4znppJOYPXs2t9xyC1dddRXr169nzpw5/O1vf2PGDGtQ0m3btrFo0SLmzZvHL37xC+68886DtvPAAw/Q3NzMrbfeetDy1tZWzj77bObOncu8efNITk4ekspuraMIwFdd3W3CouyabDJjMsd8r06l1OA899xzB71evXp1tzTp6emcffbZ3Zbn5eV1PH/yySe7vR8eHs6GDRsGn8ku9I4igEATFuXW5mr9hFJqTNJAEUDXCYuqWqqobq3WQKGUGpM0UATQdcIirchWSo1lGigC6DphUcf0p9Hah0IpNfZooAjAU1SEe+LEjorrnNocQl2hTAgPNA+TUkod3TRQBNB1HoqcGmuMJ23xpJQaizRQBGD1oTh4eHGtyFZKDdZgR49NT0/v6FB3KBdddNGQdLYDDRTdtE9Y1F6R3dDWQFlTmVZkK6UGbaSGGf/3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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "predictor_sts = task.fit(train_data,\n",
    "                         label='score',\n",
    "                         time_limits='2min',\n",
    "                         ngpus_per_trial=1,\n",
    "                         seed=123,\n",
    "                         output_directory='./ag_sts')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "We again evaluate our trained model's performance on some separate test data. Below we choose to compute the following metrics: RMSE, Pearson Correlation, and Spearman Correlation."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Total Time = 69.68335437774658s\n",
      "RMSE = 0.78\n",
      "PEARSONR = 0.8566\n",
      "SPEARMANR = 0.8545\n"
     ]
    }
   ],
   "source": [
    "dev_score = predictor_sts.evaluate(dev_data, metrics=['rmse', 'pearsonr', 'spearmanr'])\n",
    "print('Total Time = {}s'.format(predictor_sts.results['total_time']))\n",
    "print('RMSE = {:.2f}'.format(dev_score['rmse']))\n",
    "print('PEARSONR = {:.4f}'.format(dev_score['pearsonr']))\n",
    "print('SPEARMANR = {:.4f}'.format(dev_score['spearmanr']))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "Next, we use our trained model to predict the similarity score among these sentences:\n",
    "- 'The child is riding a horse.'\n",
    "- 'The young boy is riding a horse.'\n",
    "- 'The young man is riding a horse.'\n",
    "- 'The young man is riding a bicycle.'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[3.659711] [3.009852] [1.6428676]\n"
     ]
    }
   ],
   "source": [
    "sentences = ['The child is riding a horse.',\n",
    "             'The young boy is riding a horse.',\n",
    "             'The young man is riding a horse.',\n",
    "             'The young man is riding a bicycle.']\n",
    "\n",
    "score1 = predictor_sts.predict({'sentence1': [sentences[0]],\n",
    "                                'sentence2': [sentences[1]]})\n",
    "\n",
    "score2 = predictor_sts.predict({'sentence1': [sentences[0]],\n",
    "                                'sentence2': [sentences[2]]})\n",
    "\n",
    "score3 = predictor_sts.predict({'sentence1': [sentences[0]],\n",
    "                                'sentence2': [sentences[3]]})\n",
    "print(score1, score2, score3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## Save and Load\n",
    "Finally we demonstrate how to easily save and load a trained TextPrediction model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "slideshow": {
     "slide_type": "fragment"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1.6428676]\n"
     ]
    }
   ],
   "source": [
    "predictor_sts.save('saved_dir')\n",
    "predictor_sts_new = task.load('saved_dir')\n",
    "\n",
    "score3 = predictor_sts_new.predict({'sentence1': [sentences[0]],\n",
    "                                    'sentence2': [sentences[3]]})\n",
    "print(score3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "slideshow": {
     "slide_type": "slide"
    }
   },
   "source": [
    "## What's happening inside?\n",
    "\n",
    "Internally, we build the network based on pretrained NLP models including [BERT](https://arxiv.org/pdf/1810.04805.pdf), [ALBERT](https://arxiv.org/pdf/1909.11942.pdf), and [ELECTRA](https://openreview.net/pdf?id=r1xMH1BtvB). The general architecture is shown as follows, in which we have a pretrained backbone model, ELECTRA-SMALL in the implementation, and some task specific layers.\n",
    "\n",
    "<img src=\"images/bert.png\" alt=\"BERT\" style=\"width: 600px;\"/>\n",
    "\n",
    "For a more detailed explanation of pretrained language models and state-of-the-art finetuning, refer to the [D2L Book](https://d2l.ai/chapter_natural-language-processing-applications/finetuning-bert.html).\n",
    "\n",
    "In addition to transfer learning, AutoGluon trains multiple models under different hyperparameters and finally return the best model. This hyperparameter optimization will be further explored in the next tutorial."
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Slideshow",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}